﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>

int main1()
{
	char a[10] = "abcdefgh";
	strcpy(a + 1, "678");
	printf("%s\n", a);

	printf("%c", a[5]);

	return 0;
}

int main2()
{
	char a[10] = { 'H','e','l','l','\0','o' };

	printf("%s\n", a);

	printf("%c", a[4]);

	return 0;
}

struct Stu //学⽣
{
	char name[20];//名字
	int age;//年龄
};

int fun1(const void* p1, const void* p2)//此为用户实现
{
	return (*(int*)p1 - *(int*)p2);
}

int fun2(const void* p1, const void* p2)//此为用户实现
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name); //结构体类型要设置成全局变量类型
	//强制转化成struct Stu*类型，要用（）括起来
}

//int cmp_stu_by_name(const void* e1, const void* e2)
//{
//	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//}

void swap(char* p1, char* p2, int ele_sz)//此为制造商实现
{
	for (int i = 0; i < ele_sz; i++)
	{
		char emp = *p1;
		*p1 = *p2;
		*p2 = emp;

		p1++;
		p2++;
	}
}

void my_qsort(void* arr, int arr_sz, int ele_sz, int(*fcmp)(void*, void*))//此为制造商实现
{
	//使用的是冒泡排序为基础的排序，先确定趟数，为arr_sz - 1；然后确定一趟要比几次，arr_sz - 1 - i；
	for (int i = 0; i < arr_sz - 1; i++)
	{
		for (int j = 0; j < arr_sz - 1 - i; j++)
		{
			//比较大小，再确定交换
			if (fcmp((char*)arr + j * ele_sz, (char*)arr + (j + 1) * ele_sz) > 0)//元素大小为4个字节，元素转化为字符大小才能准确跳过4个字节
			//if (fcmp(&arr[j], &arr[j+1]) > 0)//元素大小为4个字节，元素转化为字符大小才能准确跳过4个字节
			{
				swap((char*)arr + j * ele_sz, (char*)arr + (j + 1) * ele_sz, ele_sz);//因为是字符类型，所以要每个字节每个字节地交换
			}
		}
	}
}

//void my_stu_qsort(struct Stu arr[], int arr_sz, int ele_sz, int(*fcmp)(void*, void*))//此为制造商实现
//{
//	//使用的是冒泡排序为基础的排序，先确定趟数，为arr_sz - 1；然后确定一趟要比几次，arr_sz - 1 - i；
//	for (int i = 0; i < arr_sz - 1; i++)
//	{
//		for (int j = 0; j < arr_sz - 1 - i; j++)
//		{
//			//比较大小，再确定交换
//			if (fcmp((char*)arr + j * ele_sz, (char*)arr + (j + 1) * ele_sz) > 0)//元素大小为4个字节，元素转化为字符大小才能准确跳过4个字节
//				//if (fcmp(&arr[j], &arr[j+1]) > 0)//元素大小为4个字节，元素转化为字符大小才能准确跳过4个字节
//			{
//				swap((char*)arr + j * ele_sz, (char*)arr + (j + 1) * ele_sz, ele_sz);//因为是字符类型，所以要每个字节每个字节地交换
//			}
//		}
//	}
//}


void test()
{
	int arr[] = {8, 7, 6, 4, 9, 5, 1, 3, 2, 10};//需要排序的数组

	//库函数中qsort函数所要求传入的参数是：数组首元素地址，数组长度，元素大小，用户自定义的比较方法
	int arr_sz = sizeof(arr) / sizeof(arr[0]);
	int ele_sz = sizeof(arr[0]);

	//qsort(arr, arr_sz, ele_sz, fun1);//排序
	my_qsort(arr, arr_sz, ele_sz, fun1);

	for (int i = 0; i < arr_sz; i++)
	{
		printf("%d ", arr[i]);
	}
}



void test2()
{
	

	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
	int sz = sizeof(s) / sizeof(s[0]);

	qsort(s, sz, sizeof(s[0]), fun2);

}


int main()
{
	//使用冒泡排序的方法模拟 qsort 函数的实现

	test();//该函数用来测试排序整型数组
	//通过test函数得知，使用qsort函数要提供：数组首元素地址，数组长度，元素大小，用户自定义的比较方法
	//而模拟 qsort 函数，则要实现①排序过程，实现②元素两两交换时的大小比较，以及传递参数给比较函数，和实现③元素的两两交换

	return 0;
}
